0.1 주의

안녕하세요. 저는 시드니 대학교에서 컴퓨터 공학을 공부하고 있는 1학년 김용현이라고 합니다. 본 리포트는 전문성은 없지만 저와 같이 주식에 입문하지 얼마 안 된 주린이라면 궁금할 만한 의문들을 학교에서 배운 기본적인 통계 지식과 R을 이용해 분석한 내용을 담고 있습니다. 이 리포트의 내용은 하나부터 열까지 저의 주관적인 논리가 바탕이 되므로 흥미 위주로만 읽어주시면 감사하겠습니다 :)

0.2 자료 출처 및 내용

출처: yahoo finance
소개: 1999년 3월 15일 부터 2022 5월 27일까지의 QQQ 데이터
내용: 일별로 QQQ의 시작가, 고점, 저점, 종가, 그리고 거래량이 기재되어 있음

library(plotly)
library(tidyverse)
qqq = read.csv("qqq_history.csv")
str(qqq)
## 'data.frame':    5842 obs. of  7 variables:
##  $ Date     : chr  "1999-03-15" "1999-03-16" "1999-03-17" "1999-03-18" ...
##  $ Open     : num  50.4 51.7 51.9 51.5 53.2 ...
##  $ High     : num  51.6 52.2 52 52.6 53.2 ...
##  $ Low      : num  49.9 51.2 51.4 51.5 51.2 ...
##  $ Close    : num  51.5 51.9 51.6 52.6 51.2 ...
##  $ Adj.Close: num  44.6 44.9 44.6 45.5 44.3 ...
##  $ Volume   : int  6369000 4905800 3965000 4848400 7160400 5024800 10962400 8447000 8133800 8256200 ...
# Number Dates
data_size = dim(qqq)[1]
qqq <- qqq %>% mutate(DateNum = 1:data_size)

# Add Year
date_split = str_split(qqq$Date, "-")
year_ls = c()
for (date in date_split){
  year = as.integer(str_split(date, "-")[1])
  year_ls = c(year_ls, year)
}
qqq <- qqq %>% mutate(Year = year_ls)

0.3 QQQ의 가격 변화 (년도별 평균 종가)

PriceByYear = qqq %>% group_by(Year) %>% summarise(price = mean(Close))
# PriceByYear
VolumeByYear = qqq %>% group_by(Year) %>% summarise(volume = mean(Volume))
# VolumeByYear
plot_ly(PriceByYear,
        x = ~Year,
        y = ~price,
        size = ~VolumeByYear$volume * price *2,
        type = "scatter",
        hoverinfo = "text",
        hovertext = paste0("년도: ", PriceByYear$Year,
                           "<br>평균 가격: $", round(PriceByYear$price, 2),
                           "<br>평귱 거래량: $", round(VolumeByYear$volume * PriceByYear$price / 1000000), "M")
        )

1 QQQ(tqqq, sqqq)를 이용한 단타 시뮬레이션

1.1 시뮬레이션 1) 매일의 QQQ 시작가 대비 종가 가격 변화 (%)

record = c()
record_sum = c()

sum = 0
for (i in 1:data_size){
  day = qqq[i,]
  diff = (day$Close - day$Open) / day$Open
  
  sum = sum + diff
  
  record = c(record, diff)
  record_sum = c(record_sum, sum)
}

qqq <- qqq %>% mutate(record_sum) %>% mutate(record)

plot_ly(qqq,
        x = ~DateNum,
        y = ~record,
        color = ~Year,
        type = "scatter",
        mode = "markers"
)
plot_ly(qqq,
        x = ~DateNum,
        y = ~record_sum,
        color = ~Year,
        type = "scatter",
        mode = "markers"
        )

1.2 시뮬레이션 2 (도박사의 오류 - Gambler’s Fallacy)

simulator <- function(initial, deposit, leverage, row){
  
  portfolio = initial
  pf_record = rep(portfolio, row)
  deposit_record = rep(portfolio, row)

for (i in (1+row):data_size){
  
  if (i %% 5 == 0){
    portfolio = portfolio + deposit
    deposit_record = c(deposit_record, tail(deposit_record, n=1) + deposit)
  } else{
    deposit_record = c(deposit_record, tail(deposit_record, n=1))
  }
  
  diff_ls = c()
  for (j in (i-row):(i-1)){
    day = qqq[j,]
    diff = (day$Close - day$Open) / day$Open
    diff_ls = c(diff_ls, diff)
  }
  
  today = qqq[i,]
  today_diff = (today$Close - today$Open) / today$Open
  
  if ( mean(diff_ls > 0) == 1){ # + in a row, so guess -
    if (today_diff > 0){ # wrong (today = +)
      portfolio = portfolio * (1 - abs(today_diff)*leverage)
    } else if(today_diff < 0){ # right (today = -)
      portfolio = portfolio * (1 + abs(today_diff)*leverage)
    }
  } else if( mean(diff_ls < 0) == 1){ # - in a row, so guess +
    if (today_diff > 0){ # right (today = -)
      portfolio = portfolio * (1 + abs(today_diff)*leverage)
    } else if (today_diff < 0){ # wrong (today = +)
      portfolio = portfolio * (1 - abs(today_diff)*leverage)
    }
  } else{
    portfolio = portfolio
  }
  
  pf_record = c(pf_record, portfolio)
}
  return (list(pf_record, deposit_record))
}

flow_simulator <- function(initial, deposit, leverage, row){
  
  portfolio = initial
  pf_record = rep(portfolio, row)
  deposit_record = rep(portfolio, row)

for (i in (1+row):data_size){
  
  if (i %% 5 == 0){
    portfolio = portfolio + deposit
    deposit_record = c(deposit_record, tail(deposit_record, n=1) + deposit)
  } else{
    deposit_record = c(deposit_record, tail(deposit_record, n=1))
  }
  
  diff_ls = c()
  for (j in (i-row):(i-1)){
    day = qqq[j,]
    diff = (day$Close - day$Open) / day$Open
    diff_ls = c(diff_ls, diff)
  }
  
  today = qqq[i,]
  today_diff = (today$Close - today$Open) / today$Open
  
  if( mean(diff_ls < 0) == 1){ # - in a row, so guess -
    if (today_diff > 0){ # wrong (today = -)
      portfolio = portfolio * (1 - abs(today_diff)*leverage)
    } else if (today_diff < 0){ # right (today = +)
      portfolio = portfolio * (1 + abs(today_diff)*leverage)
    }
  } else{
    portfolio = portfolio
  }
  
  pf_record = c(pf_record, portfolio)
}
  return (list(pf_record, deposit_record))
}


daily_get <- function(initial, deposit, leverage){
  
  portfolio = initial
  pf_record = c(initial)
  deposit_record = c(initial)

for (i in 2:data_size){
  
  if (i %% 5 == 0){
    portfolio = portfolio + deposit
    deposit_record = c(deposit_record, tail(deposit_record, n=1) + deposit)
  } else{
    deposit_record = c(deposit_record, tail(deposit_record, n=1))
  }
  
  yesterday = qqq[i-1,]
  today = qqq[i,]
  
  diff = (today$Open - yesterday$Open) / yesterday$Open
  
  portfolio = portfolio * (1 + diff*leverage)

  
  pf_record = c(pf_record, portfolio)
}
  return (list(pf_record, deposit_record))
}


r_simulator <- function(initial, deposit, leverage){
  
  portfolio = initial
  pf_record = c(initial)
  deposit_record = c(initial)

for (i in 2:data_size){
  if (i %% 5 == 0){
    portfolio = portfolio + deposit
    deposit_record = c(deposit_record, tail(deposit_record, n=1) + deposit)
  } else{
    deposit_record = c(deposit_record, tail(deposit_record, n=1))
  }

  today = qqq[i,]
  today_diff = (today$Close - today$Open) / today$Open
  
  guess = sample(c(1,-1), 1, replace=T)
  
  if (guess * today_diff > 0){
    portfolio = portfolio * (1 + abs(today_diff)*leverage)
  } else{
    portfolio = portfolio * (1 - abs(today_diff)*leverage)
  }
  
  pf_record = c(pf_record, portfolio)
}
  return (list(pf_record, deposit_record))
}


draw_plot <- function(result){
 pf_record = result[[1]]
 deposit_record = result[[2]]

 SIM <- qqq %>% mutate(pf_record) %>% mutate(deposit_record)

 P = plot_ly(SIM,
      x = ~DateNum,
      y = ~pf_record,
      color = ~Year,
      type = "scatter",
      hoverinfo = "text",
      hovertext = paste0("날짜: ", SIM$Date,
                         "<br>평가액: $", round(pf_record/1000000, 2), "M")
  )
 
 P <- P %>% add_trace(y = ~deposit_record, name = "본전", 
                              mode = "markers", color = "Red")
layout(P,
       yaxis = list(title = "포트폴리오 평가액", type="log")
)
}
  • 시작 금액: $10,000
  • 추가 입금: $1,000/ 20 영업일 (약 1달)
  • 시작가와 종가를 기준으로, 전날 가격이 올랐으면 sqqq에 전액 배팅
  • 시작가와 종가를 기준으로, 전날 가격이 내렸으면 tqqq에 전액 배팅
  • 시작가와 종가를 기준으로, 전날 가격이 동일하면 no 배팅
  • 레버리지 : 3x, 6x

1.2.1 레버리지 x3, (G.F. - 1D)

initial = 10000
deposit = 1000
result = simulator(initial, deposit, 3, 1)
draw_plot(result)

1.2.2 레버리지 x6, (G.F. - 1D)

result = simulator(initial, deposit, 6, 1)
draw_plot(result)

1.2.3 레버리지 x3, (G.F. - 2D)

result = simulator(initial, deposit, 3, 2)
draw_plot(result)

1.2.4 레버리지 x6, (G.F. - 2D)

result = simulator(initial, deposit, 6, 2)
draw_plot(result)

1.2.5 레버리지 x3, (G.F. - 3D)

result = simulator(initial, deposit, 3, 3)
draw_plot(result)

1.2.6 레버리지 x6, (G.F. - 3D)

result = simulator(initial, deposit, 6, 3)
draw_plot(result)

1.2.7 레버리지 x3, (F.S. - 2D)

result = flow_simulator(initial, deposit, 3, 2)
draw_plot(result)

1.2.8 레버리지 x6, (F.S. - 2D)

result = flow_simulator(initial, deposit, 6, 2)
draw_plot(result)

1.2.9 레버리지 x3, (F.S. - 1D)

result = flow_simulator(initial, deposit, 3, 1)
draw_plot(result)

1.2.10 레버리지 x6, (F.S.. - 1D)

result = flow_simulator(initial, deposit, 6, 1)
draw_plot(result)

1.2.11 레버리지 x1, (Daily 장투)

result = daily_get(initial, deposit, 1)
draw_plot(result)

1.2.12 레버리지 x3, (Daily 장투)

result = daily_get(initial, deposit, 3)
draw_plot(result)

1.2.13 레버리지 x6, (Daily 장투)

result = daily_get(initial, deposit, 6)
draw_plot(result)